package com.ctsi.framework.mybatis.support;

import com.ctsi.commons.util.response.Page;
import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.beans.factory.annotation.Autowired;

import java.io.Serializable;
import java.util.List;

/**
 * @author: zhangjw
 * @Date: 2018/11/15 12:09
 * @Description: 继承使用
 */
public class MybatisEntityDao<Entity> extends MybatisGenericDao{


    @Override
    @Autowired
    public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
        super.setSqlSessionFactory(sqlSessionFactory);
    }

    /**
     * DAO所管理的Entity类型
     */
    protected Class<Entity> entityClass;

    /**
     * 在构造函数中将泛型T.class赋给entityClass
     */
    public MybatisEntityDao() {
        entityClass = (Class<Entity>)GenericsUtils.getSuperClassGenricType(getClass());
    }

    public Class<Entity> getEntityClass() {
        return this.entityClass;
    }

    /**
     * 根据属性名和属性值查询对象.
     *
     * @return 符合条件的对象列表
     */
    public List<Entity> findBy(String name, Object value) {
        return this.findBy(getEntityClass(), name, value);
    }

    /**
     * 根据属性名和属性值以Like AnyWhere方式查询对象.
     */
    public List<Entity> findByLike(String name, String value) {
        return this.findByLike(getEntityClass(), name, value);
    }

    /**
     * 根据属性名和属性值查询单个对象.
     *
     * @return 符合条件的唯一对象
     */
    public Entity findUniqueBy(String name, Object value) {
        return this.findUniqueBy(getEntityClass(), name, value);
    }

    /**
     * 根据ID获取对象.
     */
    public Entity get(Serializable id) {
        return this.get(getEntityClass(), id);
    }

    /**
     * 获取全部对象.
     */
    public List<Entity> getAll() {
        return this.getAll(getEntityClass());
    }

    /**
     * 分页查询.
     */
    public Page<Entity> pagedQuery(int pageNo, int pageSize) {
        return this.pagedQuery(getEntityClass(), null, pageNo, pageSize);
    }

    /**
     * 分页查询.
     */
    public Page<Entity> pagedQuery(Object parameterObject, int pageNo, int pageSize) {
        return this.pagedQuery(getEntityClass(), parameterObject, pageNo, pageSize);
    }

    /**
     * 根据ID移除对象.
     */
    public int removeById(Serializable id) {
        return this.removeById(getEntityClass(), id);
    }


    public int remove( final List<?> oList)
    {
        return this.remove(entityClass, oList);
    }

    /**
     * 全部删除
     * @param mapperStr
     * @return
     */
    @Override
    public int delete(String mapperStr){
        return super.delete(mapperStr);
    }

}
